<template>
  <div class="prism-player" :id="playerId" :style="playStyle"></div>
</template>

<script>
export default {
  name: "AliPlayer",
  props: {

    //媒体转码服务的媒体Id。
    vid: {
      type: String,
      default: ""
    },
    //播放权证
    playauth: {
      type: String,
      default: ""
    },
    //容器的大小
    height: {
      type: String,
      default: "460px"
    },
    //容器的大小
    width: {
      type: String,
      default: "100%"
    },
    //视频的高度大小
    videoWidth: {
      type: String,
      default: "100%"
    },
    //视频的宽度大小
    videoHeight: {
      type: String,
      default: "100%"
    },
    //播放器自动加载，目前仅h5可用
    preload: {
      type: Boolean,
      default: false
    },
    //播放器默认封面图片，请填写正确的图片url地址。需要autoplay为’false’时，才生效
    cover: {
      type: String,
      default: ""
    },
    //播放内容是否为直播，直播时会禁止用户拖动进度条。
    isLive: {
      type: Boolean,
      default: false
    },
    //播放器是否自动播放，在移动端autoplay属性会失效。
    autoplay: {
      type: Boolean,
      default: false
    },
    //播放器自动循环播放。
    rePlay: {
      type: Boolean,
      default: false
    },
    //指定使用H5播放器。
    useH5Prism: {
      type: Boolean,
      default: false
    },

    //H5是否内置播放，有的Android浏览器不起作用。
    playsinline: {
      type: Boolean,
      default: false
    },



    //默认为‘hover’。可选的值为：‘click’、‘hover’、‘always’。
    controlBarVisibility: {
      type: String,
      default: "hover"
    },


    /***
     *
     *指定播放地址格式，只有使用vid的播放方式时支持
     可选值为’mp4’、’m3u8’、’flv’、’mp3’，默认为空，仅H5支持。
     * */
    format: {
      type: String,
      default: "m3u8"
    },
    /***
     *
     * 指定返回音频还是视频，只有使用vid的播放方式时支持。
     可选值为’video’和’audio’，默认为’video’
     ‘audio’主要是针对只包含音频的视频格式，比如音频的mp4，仅H5支持。
     * */
    mediaType: {
      type: String,
      default: "video"
    },
    /***
     * 指定排序方式，只有使用vid + plauth播放方式时支持。
     ‘desc’表示按倒序排序（即：从大到小排序）
     ‘asc’表示按正序排序（即：从小到大排序）
     默认值：‘asc’，仅H5支持。
     * */
    qualitySort: {
      type: String,
      default: "asc"
    },



    /**
     * 加密类型，播放点播私有加密视频时，设置值为1，默认值为0。
     * */
    encryptType: {
      type: Number,
      default: 1
    },


    playStyle: {
      type: String,
      default: ""
    },
    aliplayerSdkPath: {
      // Aliplayer 代码的路径
      type: String,
      default: "https://g.alicdn.com/de/prismplayer/2.9.3/aliplayer-min.js"
    },


  },
  data() {
    return {
      playerId: "aliplayer_" + Math.random().toString(36).substr(2),
      scriptTagStatus: 0,
      isReload: false,
      instance: null
    };
  },
  created() {
    if (window.Aliplayer !== undefined) {
      // 如果全局对象存在，说明编辑器代码已经初始化完成，直接加载编辑器
      this.scriptTagStatus = 2;
      this.initAliplayer();
    } else {
      // 如果全局对象不存在，说明编辑器代码还没有加载完成，需要加载编辑器代码
      this.insertScriptTag();
    }
  },
  mounted() {
    if (window.Aliplayer !== undefined) {
      // 如果全局对象存在，说明编辑器代码已经初始化完成，直接加载编辑器
      this.scriptTagStatus = 2;
      this.initAliplayer();
    } else {
      // 如果全局对象不存在，说明编辑器代码还没有加载完成，需要加载编辑器代码
      this.insertScriptTag();
    }
  },
  methods: {
    insertScriptTag() {
      const _this = this;
      let playerScriptTag = document.getElementById("playerScriptTag");
      // 如果这个tag不存在，则生成相关代码tag以加载代码
      if (playerScriptTag === null) {
        playerScriptTag = document.createElement("script");
        playerScriptTag.type = "text/javascript";
        playerScriptTag.src = this.aliplayerSdkPath;
        playerScriptTag.id = "playerScriptTag";
        let s = document.getElementsByTagName("head")[0];
        s.appendChild(playerScriptTag);
      }
      if (playerScriptTag.loaded) {
        _this.scriptTagStatus++;
      } else {
        playerScriptTag.addEventListener("load", () => {
          _this.scriptTagStatus++;
          playerScriptTag.loaded = true;
          _this.initAliplayer();
        });
      }
      _this.initAliplayer();
    },
    initAliplayer() {
      const _this = this;
      // scriptTagStatus 为 2 的时候，说明两个必需引入的 js 文件都已经被引入，且加载完成
      if (
        _this.scriptTagStatus === 2 &&
        (_this.instance === null || _this.reloadPlayer)
      ) {
        _this.instance && _this.instance.dispose();

        //   document.querySelector("#" +_this.playerId).innerHTML = "";

        // Vue 异步执行 DOM 更新，这样一来代码执行到这里的时候可能 template 里面的 script 标签还没真正创建
        // 所以，我们只能在 nextTick 里面初始化 Aliplayer
        _this.$nextTick(() => {
          _this.instance = window.Aliplayer({
            id: _this.playerId,
            qualitySort:_this.qualitySort,
            format:_this.format,
            mediaType:_this.mediaType,
            vid: _this.vid,
            playauth: _this.playauth,
            width: _this.width,
            height: _this.height,
            videoWidth: _this.videoWidth,
            videoHeight: _this.videoHeight,
            preload: _this.preload,
            playsinline:_this.playsinline,
            isLive: _this.isLive,
            rePlay: _this.rePlay,
            autoplay: _this.autoplay,
            useH5Prism: _this.useH5Prism,
            controlBarVisibility: _this.controlBarVisibility,
            encryptType: _this.encryptType,

          });

          // 绑定事件，当 AliPlayer 初始化完成后，将编辑器实例通过自定义的 ready 事件交出去
          _this.instance.on("ready", () => {
            this.$emit("ready", _this.instance);
          });

          _this.instance.on("play", () => {
            this.$emit("play", _this.instance);
          });

          _this.instance.on("pause", () => {
            this.$emit("pause", _this.instance);
          });

          _this.instance.on("ended", () => {
            this.$emit("ended", _this.instance);
          });

          _this.instance.on("liveStreamStop", () => {
            this.$emit("liveStreamStop", _this.instance);
          });

          _this.instance.on("m3u8Retry", () => {
            this.$emit("m3u8Retry", _this.instance);
          });

          _this.instance.on("hideBar", () => {
            this.$emit("hideBar", _this.instance);
          });

          _this.instance.on("waiting", () => {
            this.$emit("waiting", _this.instance);
          });

          _this.instance.on("snapshoted", () => {
            this.$emit("snapshoted", _this.instance);
          });

          _this.instance.on("timeupdate", () => {
            this.$emit("timeupdate", _this.instance);
          });

          _this.instance.on("requestFullScreen", () => {
            this.$emit("requestFullScreen", _this.instance);
          });

          _this.instance.on("cancelFullScreen", () => {
            this.$emit("cancelFullScreen", _this.instance);
          });

          _this.instance.on("error", () => {
            this.$emit("error", _this.instance);
          });

        });
      }
    },
    /**
     * 播放视频
     */
    play: function () {
      this.instance.play();
    },
    /**
     * 暂停视频
     */
    pause: function () {
      this.instance.pause();
    },
    /**
     * 重播视频
     */
    replay: function () {
      this.instance.replay();
    },
    /**
     * 跳转到某个时刻进行播放
     * @argument time 的单位为秒
     */
    seek: function (time) {
      this.instance.seek(time);
    },
    /**
     * 获取当前时间 单位秒
     */
    getCurrentTime: function () {
      return this.instance.getCurrentTime();
    },
    /**
     *获取视频总时长，返回的单位为秒
     * @returns 返回的单位为秒
     */
    getDuration: function () {
      return this.instance.getDuration();
    },
    /**
     获取当前的音量，返回值为0-1的实数ios和部分android会失效
     */
    getVolume: function () {
      return this.instance.getVolume();
    },
    /**
     设置音量，vol为0-1的实数，ios和部分android会失效
     */
    setVolume: function (vol) {
      this.instance.setVolume(vol);
    },
    /**
     *直接播放视频url，time为可选值（单位秒）目前只支持同种格式（mp4/flv/m3u8）之间切换暂不支持直播rtmp流切换
     *@argument url 视频地址
     *@argument time 跳转到多少秒
     */
    loadByUrl: function (url, time) {
      this.instance.loadByUrl(url, time);
    },
    /**
     * 设置播放速度
     *@argument speed 速度
     */
    setSpeed: function (speed) {
      this.instance.setSpeed(speed);
    },
    /**
     * 设置播放器大小w,h可分别为400px像素或60%百分比chrome浏览器下flash播放器分别不能小于397x297
     *@argument w 播放器宽度
     *@argument h 播放器高度
     */
    setPlayerSize: function (w, h) {
      this.instance.setPlayerSize(w, h);
    },
    /**
     *目前只支持H5播放器。
     暂不支持不同格式视频间的之间切换。
     暂不支持直播rtmp流切换。
     */
    replayByVidAndPlayAuth: function (vid, accId, accSecret, stsToken, authInfo, domainRegion) {
      this.instance.replayByVidAndPlayAuth(vid, accId, accSecret, stsToken, authInfo, domainRegion);
    },

    /***
     * 重新设置vid和权限，目前只支持H5播放器。
     暂不支持不同格式视频间的之间切换。
     暂不支持直播rtmp流切换。
     * @param vid 视频ID
     * @param playauth 播放权限
     */
    replayByVidAndAuthInfo: function (vid, playauth) {
      this.instance.replayByVidAndAuthInfo(vid, playauth);
    },

    /**
     * 目前只支持HTML5界面上的重载功能,暂不支持直播rtmp流切换m3u8）之间切换,暂不支持直播rtmp流切换
     *@argument vid 视频id
     *@argument playauth 播放凭证
     */
    reloaduserPlayInfoAndVidRequestMts: function (vid, playauth) {
      this.instance.reloaduserPlayInfoAndVidRequestMts(vid, playauth);
    },

    /***
     *设置截图参数
     * @param width 宽度
     * @param height 高度
     * @param rate 截图质量
     */
    setSanpshotProperties: function (width, height, rate) {
      this.instance.setSanpshotProperties(width, height, rate);
    },
    /**
     * 设置封面地址
     * @param cover 封面地址
     */
    setCover: function (cover) {
      this.instance.setCover(cover);
    },


    reloadPlayer: function () {
      this.isReload = true;
      this.initAliplayer();
      this.isReload = false;
    }
  }
};
</script>

<style>
@import url(https://g.alicdn.com/de/prismplayer/2.9.3/skins/default/aliplayer-min.css);
</style>
